package com.bigdata

import scala.collection.{immutable, mutable}

object Demo19Map {

  def main(args: Array[String]): Unit = {
    /**
     * map：kv格式的集合
     * List(1,2,3)
     * Map[String, Int](("zs", 18), ("ls", 20), "ww" -> 22)
     * 里面放的就是Tuple2
     */
    val map: Map[String, Int] = Map(("zs", 18), ("ls", 20), "ww" -> 22)

    /**
     * option 有2中类型，Some, None
     * Some 表示的是根据key能够查到值
     * 调用some对象的get方法，能够获取到值
     * None 表示的是根据key能够查不到值
     * 调用get方法会报错
     *
     */
    val option: Option[Int] = map.get("zs")
    //    println(option.get) // Some, None
    println(option.getOrElse(-1)) // Some, None

    println("=" * 100)

    /**
     * 给每个人的年龄加一
     * map 方法是映射，传一个值，返回一个值，返回的val的数据类型是根据返回值类型来决定的
     * map集合的map方法，函数的参数是一个二元组,
     * 返回一个新的map
     */
    val mapKv: Map[String, Int] = map.map((kv: (String, Int)) => {
      kv._1 -> (kv._2 + 1)
    })

    mapKv.foreach(tup => {
      println(tup)
    })

    //获取所有的key和value
    val keyIter: Iterator[String] = mapKv.keys.iterator
    val valIter: Iterator[Int] = mapKv.values.iterator
    keyIter.foreach(println)
    valIter.foreach(println)
    println("*" * 100)

    /**
     * 可变map集合
     * mutable包下的类，叫HashMap
     */
    val hashMap = new mutable.HashMap[String, Int]()
    hashMap.put("zs", 10)
    // 修改张三的value
    hashMap.put("zs", 5)
    hashMap.put("ls", 20)
    hashMap.put("ww", 30)

    println(hashMap.get("zs1").getOrElse(-1))

    //插入元素, 只能用 ->
    hashMap.put("zl", 40)
    //如果key存在自动覆盖
    hashMap += (("zl", 35))
    hashMap += "tq" -> 50
    println(hashMap.get("zl").getOrElse(-1))
    println(hashMap.get("tq").getOrElse(-1))

    //删除元素
    hashMap.remove("ls")
    // hashMap.-=("zl")
    hashMap -= "zl"

    println(hashMap)


    println("*" * 100)

    val map1: Map[String, Int] = Map(("001", 23), ("002", 24), "003" -> 25)
    // filter: 过滤，留下符合条件的记录（小于登录24岁的留下）
    //    val filterMap: Map[String, Int] = map1.filter((kv: (String, Int)) => {
    //      kv._2 <= 24
    //    })

    val filterMap: Map[String, Int] = map1.filter(_._2 <= 24)

    println(filterMap)


    // count: 统计符合条件的记录数
    val num: Int = map1.count(_._2 <= 24)
    println(num)

    //    contains：map中是否包含某个key
    println(map1.contains("004"))

    // exist：符合条件的记录存在与否,
    val flag: Boolean = map1.exists(_._2 > 25)
    println(flag)

  }

}
